import FoodMod from "../model/FoodMod"
import IMsg from "../../common/game/world/Msg"
import { ISize } from "../../common/game/util/V2Util"
import { ISnakeNode } from "../model/SnakeMod"

/** 客户端事件 */
export namespace ClientEvent {

    /** 客户端事件类型 */
    export enum Type {
        /** 蛇节点加载 */
        NODE_LOAD,
        /** 蛇节点卸载 */
        NODE_UNLOAD,
        /** 蛇节点死亡 */
        NODE_DIE,
        /** 食物加载 */
        FOOD_LOAD,
        /** 食物卸载 */
        FOOD_UNLOAD,
        /** 排行榜更新 */
        RANK_UPDATE,
        /** 世界大小更新 */
        WORLD_SIZE_UPDATE,
        /** 消息 */
        MSGS,
    }

    /** 客户端事件定义 */
    export type Def = {
        [Type.NODE_LOAD]: INodeLoad
        [Type.NODE_UNLOAD]: INodeUnload
        [Type.FOOD_LOAD]: IFoodLoad
        [Type.FOOD_UNLOAD]: IFoodUnload
        [Type.RANK_UPDATE]: IRankUpdate
        [Type.WORLD_SIZE_UPDATE]: IWorldSizeUpdate
        [Type.MSGS]: IMsgs
    }

    export interface INodeLoad {
        /** 加载蛇节点集合 */
        readonly loadNodes: ISnakeNode[]
    }

    export interface INodeUnload {
        /** 卸载蛇节点id集合 */
        readonly unloadNodeIds: number[]
    }

    export interface IWorldSizeUpdate {
        /** 世界大小 */
        readonly size: ISize
    }

    export interface IFoodLoad {
        /** 用于提取食物加载集合 */
        readonly model: FoodMod
    }

    export interface IFoodUnload {
        /** 用于提取食物卸载集合 */
        readonly model: FoodMod
    }

    export interface IRankUpdate {
        /** 排行榜 */
        readonly rankArr: { id: number, score: number }[]
    }

    export interface IMsgs {
        /** 消息集合 */
        readonly msgs: IMsg<any>[]
    }
}